package br.com.sgpv2.hibernate.pessoa;

import java.util.List;

import br.com.sgpv2.controler.NegocioExeception;
import br.com.sgpv2.entity.cargos.CargoFuncao;
import br.com.sgpv2.entity.organograma.Departamento;
import br.com.sgpv2.entity.organograma.Nivel;
import br.com.sgpv2.entity.organograma.Secretaria;
import br.com.sgpv2.entity.pessoa.Pessoa;
import br.com.sgpv2.entity.pessoa.PessoaDTO;
import br.com.sgpv2.entity.pessoa.endereco.Cidade;
import br.com.sgpv2.entity.pessoa.endereco.Estado;
import br.com.sgpv2.entity.pessoa.endereco.Pais;

/**
 * Interface do reposit�rio de Pessoa.
 */
public interface PessoaRepository {

	/**
	 * Método que salva uma pessoa no sistema.
	 */
	void salvar(Pessoa pessoa);

	/**
	 * Método que busca uma pessoa no sistema.
	 */
	Pessoa buscar(Integer pk) throws NegocioExeception;

	/**
	 * Método que altera uma pessoa no sistema.
	 */
	void alterar(Pessoa pessoa);

	/**
	 * Método que lista todas as pessoas do sistema.
	 */
	List<Pessoa> listar();

	/**
	 * Método que exclui um pessoa do sistema.
	 */
	void excluir(Pessoa pessoa);

	/**
	 * Método que lista todas as cidades por estado.
	 */
	List<Cidade> consultarCidadesPorEstado(String estado);

	/**
	 * Método que lista todos os estados por pa�s.
	 */
	List<Estado> consultarEstadosPorPais(Pais pais);

	/**
	 * Método que consulta todos os paises.
	 */
	List<Pais> consultarPaises();

	/**
	 * Método que consulta todos as pessoas e retona apenas o DTO.
	 */
	List<PessoaDTO> consultarPessoaDTO();

	/**
	 * Método que consulta todos as pessoas e retona apenas o DTO com filtro.
	 */
	List<PessoaDTO> consultarPessoasDTOPorFiltro(String nome, String cpf,
			String identidade);

	Pais buscarPaisPorNome(String paisTransiente);

	Estado buscarEstadoPorNome(String estadoTransiente);

	Cidade buscarCidadePorNome(String cidadeTransiente);

	List<Nivel> getNiveis();

	List<CargoFuncao> getCargosFuncoes();

	List<Departamento> getDepartamentos();

	List<Secretaria> getSecretarias();

	Secretaria buscarSecretariaPorDescricao(String descricao);

	Departamento buscarDepartamentoPorDescricao(String descricao);

	CargoFuncao buscarCargoFuncaoPorDescricao(String descricao);

	Nivel buscarNivelPorDescricao(String descricao);

}
